// function Queue () {
// 声明一个对象作为队列的存储容器
// 声明头尾两端的索引值
// }
// EnQueue: function(item) {
// 将入队的值分配一个尾部索引
// 尾部的索引值递增
// }
// DeQueue: function() {
// 检查队列是否为空
// 获取当前的头部索引指向的值
// 删除数组头部元素
// 将下一个索引变为头部索引
// 为空则重置, 确保头尾索引不会过大
// 返回删除的值
// }

function Queue () {
  let storage = {},
    top = 0,
    end = 0;
  return {
    enQueue: function (item) {
      storage[end] = item;
      end++;
    },
    deQueue: function () {
      let size = end - top;
      if (size <= 0) return undefined;
      let item = storage[top];
      delete storage[top];
      top++;
      if (top === end) {
        top = 0;
        end = 0;
      }
      return item;
    },
    size: function () {
      return end - top;
    },
    peek: function () {
      return storage[end - 1];
    },
    print: function () {
      let result = [];
      for (let key in storage) {
        result.push(storage[key]);
      }
      return result;
    }
  }
}